package com.hsu.hsurpc.serializer;

import com.caucho.hessian.io.HessianInput;
import com.caucho.hessian.io.HessianOutput;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * Hessian 序列化器实现，适用于二进制传输的序列化与反序列化
 * @Author Hsu琛君珩
 * @Date 2024-09-19 17:16
 * @Description
 * @Version: v1.0.0
 */
public class HessianSerializer implements Serializer {

    /**
     * 将对象序列化为字节数组
     *
     * @param object 需要序列化的对象
     * @return 序列化后的字节数组
     * @throws IOException 如果序列化失败
     */
    @Override
    public <T> byte[] serialize(T object) throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        HessianOutput ho = new HessianOutput(bos);

        // 使用 HessianOutput 序列化对象
        ho.writeObject(object);
        return bos.toByteArray();
    }

    /**
     * 将字节数组反序列化为对象
     *
     * @param bytes 字节数组
     * @param tClass 需要反序列化成的对象类型
     * @return 反序列化后的对象
     * @throws IOException 如果反序列化失败
     */
    @Override
    public <T> T deserialize(byte[] bytes, Class<T> tClass) throws IOException {
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        HessianInput hi = new HessianInput(bis);

        // 使用 HessianInput 反序列化对象
        return (T) hi.readObject(tClass);
    }
}
